/* 
 * File:   Player.cpp
 * Created on 13. Juni 2011, 14:17
 */

#include "Util.h"
#include "Player.h"

Player::Player() {
    engine = createIrrKlangDevice();
    music = 0;
    isBreakPressed = false;
    isStopPressed = false;
}

Player::~Player() {
    music->drop();
    engine->drop();
}

/**
 * play()
 * spielt den Titel ab, unterscheidet dabei ob vorher Pause gedrückt war.
 * Dies dient dazu, dass der Titel dann von der jeweiligen Position weiterspielt. 
 * @param filename, der Dateiname 
 */
bool Player::play(const char* filename) {
    isStopPressed = false;
    if (!isBreak() && !engine->isCurrentlyPlaying(filename)) {
        setBreak(true);
        music = engine->play3D(filename, vec3df(0, 0, 0), false, false, true);
    } else {
        engine->setAllSoundsPaused(false);
        setBreak(false);
    }
    if (engine) {
        return true;
    } else {
        return false;
    }
}

/**
 * isMusicFinished()
 * @return das Ende des Titels.
 */
bool Player::isMusicFinished() {
    if(music)
        return music ->isFinished();
    else
        return 0;
}

/**
 * setPlayPosition()
 * setzt die Position während des abspielens
 * @param position, Position als ik_u32 Wert.
 */
void Player::setPlayPosition(ik_u32 position) {
    if (music)
        music->setPlayPosition(position);
}

/**
 * getPlayPosition()
 * Liefert die aktuelle Position der Wiedergabe.
 * @return Position als ik_u32 Wert.
 */
ik_u32 Player::getPlayPosition() {
    if(music)
        return music->getPlayPosition();
    else
        return 0;
}

/**
 * getPlayLength()
 * Länge des Titels ausgeben.
 * @return Länge als INT Wert
 */
ik_u32 Player::getPlayLength() {
    if(music)
        return music->getPlayLength();
    else
        return 0;
}

/**
 * setVolume()
 * Die Lautstärke der Wiedergabe setzen.
 * @param volume, Float Zahl von 0 bis 1
 */
void Player::setVolume(float volume) {
    if (engine)
        engine->setSoundVolume(volume);
}

/**
 * stop()
 * Stopt die Wiedergabe und setzt anschließend den Schalter(isStopPressed) der 
 * die Wiedergabe als gestoppt kennzeichnet.
 */
void Player::stop() {
    isStopPressed = true;
    if (engine)
        engine->stopAllSounds();
    setBreak(false);
}

/**
 * pause()
 * Pausiert die Wiedergabe und setzt den Zustand auf Pause, wenn zuvor die 
 * Wiedergabe nicht gestoppt wurde. 
 */
void Player::pause() {
    if (engine)
        engine->setAllSoundsPaused();
    if (!isStopPressed)
        setBreak(true);
}

/**
 * setBreak()
 * Setzt den Pause-Zustand.
 * @param state true/false Wert
 */
void Player::setBreak(bool state) {
    this->isBreakPressed = state;
}

/**
 * isBreak()
 * Gibt den Pause-Zustand zurück.
 * @return true/false Wert
 */
bool Player::isBreak() {
    return this->isBreakPressed;
}
